#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <wait.h>


// void handler(int sig)
// {
//     while(true)
//     {
//         /* 获取peding表 */
//         sigset_t pending;
//         sigpending(&pending);
//         std::cout << "pending:";
//         for(int i = 31; i >= 1; --i)
//         {
//             if(sigismember(&pending, i))
//                 std::cout << "1";
//             else
//                 std::cout << "0";
//         }
//         std::cout << std::endl;
//         sleep(1);
//     }
// }

// int main()
// {
//     struct sigaction act, oldact;
//     act.sa_handler = handler;
//     sigemptyset(&act.sa_mask);
//     /* 屏蔽3,4号信号 */
//     sigaddset(&act.sa_mask, 3);
//     sigaddset(&act.sa_mask, 4);
//     act.sa_flags = 0;
//     sigaction(SIGINT, &act, &oldact);

//     while(true)
//     {
//         std::cout << "我是一个进程, pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }


// volatile int flag = 0;

// void handler(int sig)
// {
//     std::cout << "Get a signal: " << sig << std::endl;
//     flag = 1;
//     std::cout << "change flag: " << flag << std::endl;  
// }

// int main()
// {
//     signal(2, handler);
//     while(!flag);    
//     std::cout << "process exit success!" << std::endl;
//     return 0;
// }

// /* 捕捉自定义信号回收子进程 */
// void handler(int sig)
// {
//     // father
//     pid_t rid = waitpid(-1, nullptr, 0);
//     std::cout << "I Get a Signal: " << sig << std::endl;
//     if(rid > 0)
//     {
//         std::cout << "子进程退出了, 回收成功, child id: " << rid << std::endl;
//     }

// }

// int main()
// {
//     /* 捕捉SIGCHLD信号 */
//     struct sigaction act;
//     act.sa_handler = handler;
//     sigaction(SIGCHLD, &act, nullptr);
//     pid_t id = fork();
//     if(id == 0)
//     {
//         // child
//         std::cout << "I am child, my pid: " << getpid() << std::endl;
//         sleep(1);
//         exit(1);
//     }
//     else
//     {
//         while(true)
//         {
//             sleep(1);
//         }
//         std::cout << "I am father, I will exit" << std::endl;
//     }
//     return 0;
// }


int main()
{
    signal(SIGCHLD, SIG_IGN);
    for(int i = 0; i < 5; ++i)
    {
        if(fork() == 0)
        {
            // child
            std::cout << "I am child, my pid: " << getpid() << std::endl;
            sleep(3);
            exit(1);
        }
    }
   
    // father
    while(true)
    {
        sleep(1);
    }
    std::cout << "I am father, I will exit" << std::endl;
    return 0;
}